package be.redtree.bean;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.persistence.Transient;
import javax.portlet.PortletRequest;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;
import org.primefaces.component.dnd.Droppable;
import org.primefaces.event.DragDropEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import be.redtree.initialize.DefaultValuesBuilder;
import be.redtree.library.Library;
import be.redtree.model.Document;
import be.redtree.model.DocumentModel;
import be.redtree.model.Field;
import be.redtree.model.FieldResult;
import be.redtree.model.Form;
import be.redtree.model.FormResult;
import be.redtree.model.MultiValue;
import be.redtree.model.SingleValue;
import be.redtree.sql.FormController;
import com.csvreader.CsvWriter;
import com.liferay.faces.portal.context.LiferayFacesContext;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portlet.bookmarks.util.comparator.EntryNameComparator;
import com.liferay.portlet.documentlibrary.model.DLFileEntry;
import com.liferay.portlet.documentlibrary.model.DLFolder;
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.storage.Fields;
@ManagedBean
@ViewScoped
public class WebFormControlBean implements Serializable {
private static Log sLog = LogFactory.getLog(WebFormControlBean.class);
private FormController formController = new FormController();
private static String MESSAGE_SAVED_SUCCESS = "be.redtree.form.message.save";
private static String MESSAGE_DELETE_SUCCESS = "be.redtree.form.message.delete";
private Integer tabIndex;
private List<Field> availableFields;
private Form form;
private TreeNode root;
private Document selectedTreeFolder;
private DocumentModel files;
private Document tempDocument;
private List<Form> forms;
private List<Form> templates;
private Boolean displayResults;
private List<Locale> locales;
public WebFormControlBean() {
this.tabIndex = 0;
this.files = new DocumentModel(new ArrayList<Document>());
this.availableFields = new ArrayList<Field>();
this.locales = Arrays.asList(LanguageUtil.getAvailableLocales());
String uuid = null;
SingleValue value = null;
List<MultiValue> values = new ArrayList<MultiValue>();
Integer weight = 0;
Boolean mandatory = false;
String message = null;
String title = null;
String style = null;
String tempValue = null;
String css = null;
Integer size = 0;
String formats = null;
availableFields.add(new Field(uuid, "text", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "textfield", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "textarea", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "checkbox", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "radio", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "drop", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "upload", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
availableFields.add(new Field(uuid, "image", null, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats));
Collections.sort(availableFields, fieldNameComparator);
clearForm();
}
public void initializeNewForm() {
this.tabIndex = 2;
this.displayResults = false;
clearForm();
}
public void editForm(Long id) {
this.displayResults = true;
loadForm(id);
}
public void editTemplate(Long id) {
this.displayResults = false;
loadForm(id);
}
public List<String> getUploadFormats(Field field) {
List<String> formats = new ArrayList<String>();
if (field != null && field.getFormats() != null && !field.getFormats().isEmpty()) {
String[] formats_ = field.getFormats().split("\\|");
for (String format : formats_) {
formats.add(format);
}
}
return formats;
}
public void addUploadFormat(Field field) {
String format = field.getTempValue();
if (field != null && field.getFormats() != null && !field.getFormats().isEmpty()) {
field.setFormats(field.getFormats() + "|" + format);
} else {
field.setFormats(format);
}
field.tempValue = null;
}
public String getLocaleTitle(Locale locale) {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
String language = locale.getDisplayLanguage(themeDisplay.getLocale());
String country = locale.getDisplayCountry(themeDisplay.getLocale());
return language + " (" + country + ")";
}
private void loadForm(Long id) {
this.tabIndex = 2;
this.form = formController.getForm(id);
}
public void resultsForm(Long id) {
this.tabIndex = 3;
this.displayResults = true;
this.form = formController.getForm(id);
}
public void deleteForm() {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
formController.deleteForm(this.form);
clearForm();
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_DELETE_SUCCESS), ""));
}
public void processForm(Long id) {
this.form = formController.getForm(id);
}
public void saveTemplateForm() {
Form form = Library.duplicateForm(this.form);
form.setTemplate(false);
this.displayResults = true;
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_SAVED_SUCCESS), ""));
}
public void saveTemplate() {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
this.displayResults = false;
Boolean template = true;
if (form.getId() == null) {
createNewForm(template);
} else {
if (!form.getTemplate()) {
Form form = Library.duplicateForm(this.form);
form.setTemplate(true);
Long id = formController.addForm(form);
this.form = formController.getForm(id);
} else {
form.setTemplate(template);
formController.editForm(form);
}
}
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_SAVED_SUCCESS), ""));
}
public void saveForm() {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
Boolean template = false;
if (this.form.getId() == null) {
createNewForm(template);
this.displayResults = false;
} else {
formController.editForm(form);
if (!form.getTemplate()) {
this.displayResults = true;
}
}
this.form = formController.getForm(form.getId());
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage("growl", new FacesMessage(LanguageUtil.get(themeDisplay.getLocale(), MESSAGE_SAVED_SUCCESS), ""));
}
private void createNewForm(Boolean template) {
formController.addForm(form);
}
public void downloadResults(Long formId) throws IOException, PortalException, SystemException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(out);
char separator = ';';
CsvWriter csvWriter = new CsvWriter(writer, separator);
int offset = 2;
Form form = formController.getForm(formId);
List<Field> fields = new ArrayList<Field>(form.getFields());
Collections.sort(fields, Form.fieldWeightComparator);
List<FormResult> formResults = formController.getFormResults(formId);
String[] header = new String[fields.size() + offset];
header[0] = "screename";
header[1] = "creation";
int y = offset;
for (Field field : fields) {
header[y] = field.getName();
y++;
}
csvWriter.writeRecord(header);
for (FormResult formResult : formResults) {
// Users
String[] values = new String[fields.size() + offset];
values[0] = "0";
if (!formResult.getUserId().equals(new Long(0))) {
User user = null;
try {
user = UserLocalServiceUtil.getUser(formResult.getUserId());
values[0] = user.getScreenName();
} catch (PortalException e) {
e.printStackTrace();
} catch (SystemException e) {
e.printStackTrace();
}
}
// Date
DateTime dateTime = new DateTime(formResult.getCreated());
values[1] = dateTime.getDayOfMonth() + "/" + dateTime.getMonthOfYear() + "/" + dateTime.getYear() + " " + dateTime.getHourOfDay() + ":" + dateTime.getMinuteOfHour() + ":" + dateTime.getSecondOfMinute();
int x = offset;
for (Field field : fields) {
String content = "";
if (field.getName().equals("text")) {
content = field.getValue().getContent();
} else {
for (FieldResult fieldResult : formResult.getFields()) {
if (field.getId().equals(fieldResult.getFieldId())) {
content = fieldResult.getContent();
}
}
}
values[x] = content;
x++;
}
csvWriter.writeRecord(values);
}
csvWriter.close();
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
Long groupId = themeDisplay.getCompany().getGroup().getGroupId();
DLFolder dlFolder = DLFolderLocalServiceUtil.getFolder(groupId, new Long(0), DefaultValuesBuilder.FOLDER_DOWNLOAD);
DateTime dateTime = new DateTime();
ServiceContext serviceContext = new ServiceContext();
Long userId = themeDisplay.getCompany().getDefaultUser().getUserId();
long repositoryId = groupId;
long folderId = dlFolder.getFolderId();
String sourceFileName = "webform_export_" + dateTime.getDayOfMonth() + "-" + dateTime.getMonthOfYear() + "-" + dateTime.getYear() + "_" + dateTime.getMillis() + ".csv";
String mimeType = "application/csv";
String title = sourceFileName;
String description = "";
String changeLog = "";
long fileEntryTypeId = new Long(0);
Map<String, Fields> fieldsMap = new HashMap<String, Fields>();
File file = null;
InputStream is = new ByteArrayInputStream(out.toByteArray());
long size = out.toByteArray().length;
DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.addFileEntry(userId, groupId, repositoryId, folderId, sourceFileName, mimeType, title, description, changeLog, fileEntryTypeId, fieldsMap, file, is, size, serviceContext);
String url = "/../documents/" + groupId + "/" + folderId + "/" + URLEncoder.encode(dlFileEntry.getName(), "UTF-8") + "/" + dlFileEntry.getUuid();
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}
public void clearForm() {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
Long companyId = themeDisplay.getCompanyId();
String name = "";
Boolean template = false;
Boolean allowGuest = false;
Boolean accessResults = false;
Boolean allowMultiple = false;
Boolean userCopy = false;
Boolean userinfo = false;
Boolean anonymous = false;
Boolean sendMail = false;
String email = "";
List<Field> fields = new ArrayList<Field>();
Locale locale = LocaleUtil.getDefault();
form = new Form(companyId, locale, name, template, allowGuest, accessResults, allowMultiple, userCopy, userinfo, anonymous, sendMail, email, fields);
}
public void moveUpOption(Field field, String idRadio) {
List<MultiValue> values = new ArrayList<MultiValue>(field.getValues());
Set<MultiValue> valuesTemp = new HashSet<MultiValue>();
for (MultiValue option : values) {
if (option.getName().equals(idRadio)) {
int weight = option.getWeight();
if (weight > 0) {
weight--;
}
option.setWeight(weight);
}
valuesTemp.add(option);
}
field.setValues(valuesTemp);
}
public void moveDownOption(Field field, String idRadio) {
List<MultiValue> values = new ArrayList<MultiValue>(field.getValues());
Set<MultiValue> valuesTemp = new HashSet<MultiValue>();
for (MultiValue option : values) {
if (option.getName().equals(idRadio)) {
int weight = option.getWeight();
weight++;
option.setWeight(weight);
}
valuesTemp.add(option);
}
field.setValues(valuesTemp);
}
public void removeOption(Field field, String idRadio) {
List<MultiValue> list = new ArrayList<MultiValue>();
for (MultiValue value : field.getValues()) {
if (!value.getName().equals(idRadio)) {
list.add(value);
}
}
field.setValues(new HashSet<MultiValue>(list));
}
public void addOptionValue(Field field) {
List<MultiValue> values = new ArrayList<MultiValue>();
if (field.getValues() != null) {
values = new ArrayList<MultiValue>(field.getValues());
}
MultiValue multiValue = new MultiValue(UUID.randomUUID().toString(), 0, field.tempValue, false, field);
values.add(multiValue);
field.tempValue = null;
field.setValues(new HashSet<MultiValue>(values));
}
public String getLocalContent(Field field, MultiValue multiValue) {
String json = multiValue.getContent();
Map<String, String> values = Library.getJsonMapping(json);
String locale_ = field.getLocaleValue().toString();
String value = values.get(locale_);
if (value == null) {
return "";
}
return value;
}
public void removeField(String id) {
List<Field> tempavailableFields = new ArrayList<Field>();
for (Field field : this.form.getFields()) {
if (!field.getUuid().equals(id)) {
tempavailableFields.add(field);
}
}
this.form.setSelectedFields(tempavailableFields);
}
public void usePreviewImage(Field field) throws NumberFormatException, PortalException, SystemException, UnsupportedEncodingException {
DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(new Long(this.tempDocument.getId()));
String url = "/../documents/" + dlFileEntry.getGroupId() + "/" + dlFileEntry.getFolderId() + "/" + URLEncoder.encode(dlFileEntry.getTitle(), "UTF-8") + "/" + dlFileEntry.getUuid();
field.getValue().setContent(url);
}
public void onFieldSort() {
FacesContext context = LiferayFacesContext.getCurrentInstance();
String ids_ = (String) context.getExternalContext().getRequestParameterMap().get("ids");
if (ids_ != null) {
String[] ids = ids_.split("\\|");
List<Field> tempavailableFields = new ArrayList<Field>();
for (String id : ids) {
for (Field field : this.form.getFields()) {
if (field.getUuid().equals(id)) {
tempavailableFields.add(field);
}
}
}
int x = 0;
for (Field field : tempavailableFields) {
field.setWeight(x++);
}
this.form.setSelectedFields(tempavailableFields);
}
}
public void onFieldDrop(DragDropEvent ddEvent) {
Droppable source = (Droppable) ddEvent.getSource();
String dataSource = source.getDatasource();
String dragId = ddEvent.getDragId();
if (dragId.contains(dataSource)) {
Field tempField = (Field) ddEvent.getData();
String uuid = UUID.randomUUID().toString();
String name = tempField.getName();
SingleValue value = null;
String title = "";
List<MultiValue> values = new ArrayList<MultiValue>();
Integer weight = this.form.getSelectedFields().size() + 1;
Boolean mandatory = tempField.getMandatory();
String message = tempField.getMessage();
String style = tempField.getStyle();
String tempValue = "";
String css = "";
Integer size = 3000;
String formats = "gif|jpeg|png";
Field field = new Field(uuid, name, form, value, values, weight, mandatory, message, title, style, css, tempValue, size, formats);
field.setValue(new SingleValue("", 0, "", false, field));
this.form.getFields().add(field);
}
}
public List<Field> getavailableFields() {
return availableFields;
}
public void setavailableFields(List<Field> availableFields) {
this.availableFields = availableFields;
}
public String getDialogId(String uuid) {
uuid = uuid.replaceAll("\\-", "");
return "dialog_" + uuid;
}
public String getColumnId(String uuid) {
uuid = uuid.replaceAll("\\-", "");
return "column_" + uuid;
}
public List<Form> getForms() {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
this.forms = formController.getForms(themeDisplay.getCompanyId(), false);
return this.forms;
}
public List<Form> getTemplates() {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
this.templates = formController.getForms(themeDisplay.getCompanyId(), true);
return templates;
}
public void setTemplates(List<Form> templates) {
this.templates = templates;
}
public void setForms(List<Form> forms) {
this.forms = forms;
}
public Integer getTabIndex() {
return tabIndex;
}
public void setTabIndex(Integer tabIndex) {
this.tabIndex = tabIndex;
}
public List<Field> getselectedFields() {
List<Field> fields = new ArrayList<Field>(this.form.getFields());
if (!fields.isEmpty()) {
Collections.sort(fields, Form.fieldWeightComparator);
}
return fields;
}
public TreeNode getRoot() {
if (this.root != null) {
return this.root;
}
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
Long groupId = themeDisplay.getScopeGroupId();
Long folderId = new Long(0);
TreeNode treeNode = new DefaultTreeNode("root", null);
buildTree(groupId, folderId, treeNode);
this.root = treeNode;
return root;
}
private void buildTree(Long groupId, Long folderId, TreeNode treeNode) {
List<DLFolder> folders = new ArrayList<DLFolder>();
try {
folders = DLFolderLocalServiceUtil.getFolders(groupId, folderId);
} catch (SystemException e) {
e.printStackTrace();
}
for (DLFolder dlFolder : folders) {
try {
TreeNode folderNode = new DefaultTreeNode(new Document("" + dlFolder.getFolderId(), dlFolder.getName(), "folder"), treeNode);
buildTree(groupId, dlFolder.getFolderId(), folderNode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public String getLocaleId() {
UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
String name = component.toString();
while (!name.startsWith("org.primefaces.component.panelgrid.PanelGrid")) {
component = component.getParent();
if (component == null) {
return null;
}
name = component.toString();
}
return component.getId();
}
public void setRoot(TreeNode root) {
this.root = root;
}
public void onNodeTreeSelect(NodeSelectEvent event) {
Document document = (Document) event.getTreeNode().getData();
this.selectedTreeFolder = document;
}
public Document getSelectedTreeFolder() {
return selectedTreeFolder;
}
public void setSelectedTreeFolder(Document selectedTreeFolder) {
this.selectedTreeFolder = selectedTreeFolder;
}
public DocumentModel getFiles() throws SystemException, NumberFormatException, PortalException {
List<Document> documents = new ArrayList<Document>();
List<DLFileEntry> dlFileEntries = new ArrayList<DLFileEntry>();
OrderByComparator obc = new EntryNameComparator();
if (this.selectedTreeFolder != null) {
DLFolder dlFolder = DLFolderLocalServiceUtil.getDLFolder(new Long(this.selectedTreeFolder.getId()));
dlFileEntries = ListUtil.copy(DLFileEntryLocalServiceUtil.getFileEntries(dlFolder.getGroupId(), dlFolder.getFolderId(), -1, -1, obc));
} else {
PortletRequest portletRequest = (PortletRequest) LiferayFacesContext.getCurrentInstance().getExternalContext().getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
dlFileEntries = ListUtil.copy(DLFileEntryLocalServiceUtil.getFileEntries(themeDisplay.getScopeGroupId(), new Long(0), -1, -1, obc));
}
for (DLFileEntry dlFileEntry : dlFileEntries) {
documents.add(new Document("" + dlFileEntry.getFileEntryId(), dlFileEntry.getTitle(), dlFileEntry.getExtension()));
}
this.files = new DocumentModel(documents);
return files;
}
public void setFiles(DocumentModel files) {
this.files = files;
}
public Document getTempDocument() {
return tempDocument;
}
public void setTempDocument(Document tempDocument) {
this.tempDocument = tempDocument;
}
public Boolean getDisplayResults() {
return displayResults;
}
public void setDisplayResults(Boolean displayResults) {
this.displayResults = displayResults;
}
public List<Locale> getLocales() {
return locales;
}
public void setLocales(List<Locale> locales) {
this.locales = locales;
}
public Form getForm() {
return form;
}
public void setForm(Form form) {
this.form = form;
}
/*
* SORTING
*/
@Transient
public static Comparator<Field> fieldNameComparator = new Comparator<Field>() {
public int compare(Field f1, Field f2) {
return f1.getName().compareTo(f2.getName());
}
};
}